from pprint import pprint


class Graph(object):
    def __init__(self):
        self.nodes = []  # 表示图的顶点集
        self.arc = {}  # 表示图的弧集

    def insert(self, a, b):
        # 如果顶点不在顶点集中
        if not (a in self.nodes):
            # 添加顶点
            self.nodes.append(a)
            # 创建一个空dict, 用来存与该顶点连接的顶点
            self.arc[a] = dict()
        # 如果顶点不在顶点集中
        if not (b in self.nodes):
            # 添加顶点
            self.nodes.append(b)
            # 创建一个空dict, 用来存与该顶点连接的顶点
            self.arc[b] = dict()
        # a 的 弧头 和 弧尾
        if "to" in self.arc[a] and "from" in self.arc[a]:
            self.arc[a]["to"].append(b)
            self.arc[a]["from"].append(b)
        else:
            self.arc[a]["to"] = list(b)
            self.arc[a]["from"] = list(b)

        # b 的 弧头 和 弧尾
        if "to" in self.arc[b] and "from" in self.arc[b]:
            self.arc[b]["to"].append(a)
            self.arc[b]["from"].append(a)
        else:
            self.arc[b]["to"] = list(a)
            self.arc[b]["from"] = list(a)

    def succ(self, k):
        # 返回与 顶点 连接的 其他顶点
        return self.arc[k]

    def show_nodes(self):
        # 返回图的顶点集
        return self.nodes

    def show_arc(self):
        # 打印图的弧
        pprint(self.arc)


graph = Graph()
graph.insert('0', '1')
graph.insert('0', '2')
graph.insert('0', '3')
graph.insert('1', '3')
graph.insert('2', '3')
pprint(graph.show_nodes())
graph.show_arc()
pprint(graph.succ("0"))